package BioRostro;

import adirector.Record;
import adirector.saSpeedMatch;
import java.util.List;

import javax.swing.JOptionPane;

import com.neurotechnology.CameraMan.Camera;
import com.neurotechnology.CameraMan.CameraMan;
import com.neurotechnology.Faces.NLExtractor;
import com.neurotechnology.NImages.NImage;
import com.neurotechnology.NLicensing.LicensingConfig;
import com.neurotechnology.NLicensing.NLicensing;
import com.neurotechnology.NMatcher.NMatcher;
import com.neurotechnology.Templates.NLTemplate;
import pkg1ifxArchivos.caDatosTemplate;
import pkg1ifxArchivos.cifxLogs;

public class BioRostro {

    //Strail 8feb2012
    protected static cifxLogs olog=new cifxLogs();
	private static final long serialVersionUID = 1L;

	//CameraMan cameraman;
	//NLExtractor extractor;
	NMatcher matcher;

	//Enroller enroller;
        
	boolean detecFaces;
	boolean detectEyes;
	boolean doEnroll;
	boolean doVerify;

	NLTemplate currTemplate;
	NImage currimage;

	Camera cameras[];
	int currCamera;
	RecordDB facedb;
        private int ninicio=0;
        private int nfinal =-1;
        //Strail 13feb2012
        private saSpeedMatch speedmatch;

        public void setRango(int minicio, int mfinal)
        {
            ninicio=minicio;
            nfinal=mfinal;
        }
            //Strail 8feb2012
        private int nMatchingTreshold=90;
        public void setMatchingTreshold(int dato)
        {
            nMatchingTreshold=dato;
            olog.outMensaje("BioRostro.setMatchingTreshold(): (ROSTRO) Asignando ("+nMatchingTreshold+") a setFaceMatchingThreshold: " );
            matcher.setFaceMatchingThreshold(nMatchingTreshold);
        }
	// private FileNameExtensionFilter imageFilter;

        //Strail 13ene2012

        public synchronized void actualizaArrayList(caDatosTemplate odatostemplate)
        {
           //Strail 13feb2012 facedb.actualizarArrayListRostro(odatostemplate);
           //facedb.actualizarArrayListRostro(odatostemplate);
           try{
               //Strail 13feb2012
               Record fr = null;
                for(int i=0; i < odatostemplate.getTemplate().length; i++)
                {
                    fr = new Record();
                    fr.setName(odatostemplate.getCedulas()[0]);
                    fr.setId(odatostemplate.getTemplate()[i].Id);
                    fr.setTempalte(odatostemplate.getTemplate()[i].getTemplate());
                }
                //recordsList.add(fr);
               if(fr!=null)
                    speedmatch.agregaRecordTemplate(fr);
           }catch(Exception e)
           {
               olog.outMensaje("BioRostro.actualizaArrayList(): (ROSTRO) ERROR(0): "+e.getMessage() );
           }
        }
	public BioRostro(int minicio,int mfinal,cifxLogs dlog) {

            olog=dlog;
            LicensingConfig licConfig = LicensingConfig.getInstance();
            String licensesString = licConfig.getLicenseString("FacesMatcher");
            if (!NLicensing.licenseObtain(licConfig.getServerIP(), licConfig.getServerPort(), licensesString)) {
                olog.outMensaje("BioRostro.BioRostro(): (ROSTRO) (ERROR 4) No puedo obtener las licencias  ("+licensesString
                            +")");
                //Strail 8feb2012    JOptionPane.showMessageDialog(null, "Unable to obtain the following licenses: " + licensesString,
                //Strail 8feb2012                    "Failed to obtain required licenses", JOptionPane.ERROR_MESSAGE);
            }else {
                //Strail 8feb2012 System.out.println("License obtained - " + licensesString);
                olog.outMensaje("BioRostro.BioRostro(): (ROSTRO) licencias OK ("+licensesString +")");
            }

            try {
                //Strail 8feb2012 JOptionPane.showInputDialog(this, "va a emppezar a cargar las licencias de rostro");
                            //Strail 8feb2012

                olog.outMensaje("BioRostro.BioRostro(): (ROSTRO) Inicio carga de licencias " );
                olog.outMensaje("-----------------------------------------------------------" );
                olog.outMensaje("-(ROSTRO) INICIO CARGA DE LICENCIAS                       -" );
                olog.outMensaje("-                                                         -" );
                olog.outMensaje("-                                   <ACEPTAR> <CANCELAR>  -" );
                olog.outMensaje("-----------------------------------------------------------" );
                    //extractor = new NLExtractor();
                    matcher = new NMatcher();
                    ninicio=minicio;
                    nfinal=mfinal;

                    //Strail 13feb2012
                    speedmatch = new saSpeedMatch(matcher, null, dlog,1);
                    //Strail 13feb2012 facedb = new RecordDB(ninicio,nfinal);
                    facedb = new RecordDB(ninicio,nfinal,speedmatch);
            } catch (Exception e) {
                //Strail 8feb2012
                olog.outMensaje("BioRostro.BioRostro(): (ROSTRO) ERROR 2: "+e.getMessage() );
                //Strail 8feb2012    e.printStackTrace();
            }

            //enroller = new Enroller(this);

            detecFaces = true;
            detectEyes = true;

            //olog.outMensaje("BioRostro.BioRostro(): (ROSTRO) Asignando ("+nMatchingTreshold+") a setFaceMatchingThreshold: " );
            matcher.setFaceMatchingThreshold(nMatchingTreshold);

//                Settings conf = new Settings();
//                conf.setVisible(true);
	}

        public synchronized void inserttemplateRostro(String maxID) {

            try{
                facedb.grabarRostro(maxID);
                return;
            } catch (Exception ex) {

                olog.outMensaje("BioRostro.inserttemplateRostro(): (ROSTRO) ERROR : "+ex.getMessage() );

            }
        }

        public synchronized String leerTempVerificar(byte[] template,String cedula){

            try{
                identificados=facedb.selectTemplate(template,cedula,matcher);

                /*int score = matcher.verify(tempBD, template);
                if(score !=0)
                    identificados="1|"+cedula;
                else
                    identificados="-1|-1";
                 *
                 */

                return identificados;
            }catch(Exception er)
            {
                olog.outMensaje("BioRostro.leerTempVerificar(): (ROSTRO) ERROR : "+er.getMessage() );
                return "";
            }
        }
        public synchronized String leerTempIdentificar(byte[] template){
            try{
                find(template);
                return identificados;
            }catch(Exception er)
            {
                olog.outMensaje("BioRostro.leerTempIdentificar(): (ROSTRO) ERROR : "+er.getMessage() );
                return "";
            }
        }


	public void print1(String text) {
            System.out.println(text);
	}
        String identificados;
	public synchronized void find(byte[] template) {
                identificados = "";
                identificados=speedmatch.find(template);
                /*int cont = 0 ;
		try {
                    olog.outMensaje("<- BioRostro.find(): Inicio busqueda (ROSTRO) "+template.toString());
			matcher.identifyStart(template);
			List<Record> frs = facedb.getRecords();
			for (Record faceRecord : frs) {
				int score = matcher.identifyNext(faceRecord.getTempalte());
				if (score != 0) 
                                        identificados = identificados+"|"+faceRecord.getName(); 

                                cont += 1;
					//print1("Match fount: ID - " + faceRecord.getId() + ", name - " + faceRecord.getName() + ", score - " + score + "\n");
			}
			matcher.identifyEnd();
                        identificados = cont+identificados;
                        olog.outMensaje("<- BioRostro.find(): Termina busqueda (ROSTRO) "+identificados);
		} catch (Exception e) {
			//Strail 8feb2012 e.printStackTrace();
                        olog.outMensaje("BioRostro.find(): (ROSTRO) ERROR : "+e.getMessage() );
		}
                 * 
                 */
	}

	public void verify(NLTemplate tmpl) {
		try {
			if (currimage == null)
				return;
			if (currTemplate == null) {
				currTemplate = tmpl;
				//Strail 8feb2012 this.print1("Extract next tempalte for verification\n");
                                olog.outMensaje("BioRostro.verify(): (ROSTRO) Extrae el proximo template: " );
				return;
			}
			double scr = matcher.verify(tmpl, currTemplate);
			//Strail 8feb2012 print1("Matching successful score = " + scr + "\n");
                        olog.outMensaje("BioRostro.verify(): (ROSTRO) Matching ok score=: "+ scr );
		} catch (Exception e) {
			//Strail 8feb2012 print1(e.getMessage() + "\n");
			//Strail 8feb2012 System.out.println(e.getMessage());
			//Strail 8feb2012 e.printStackTrace();
                        olog.outMensaje("BioRostro.verify(): (ROSTRO) ERROR : "+e.getMessage() );
		}
	}
//
//	public void setTemplate(NImage image, NLTemplate template, boolean generalized) {
//		if (image != null) {
//			this.currimage = image;
//		}
//		if (!doEnroll){
//			if(doVerify) verify(template);
//			else find(template);
//			return;
//		}
//		this.currTemplate = template;
//		if (doEnroll && template != null){
//			String name = (String) JOptionPane.showInputDialog(
//                   this,
//                    "Enter user name:\n",
//                    "Enter name",
//                    JOptionPane.PLAIN_MESSAGE);
//			try{
//				if(name != null) facedb.append(name, image, template);
//			}catch (Exception e) {
//				e.printStackTrace();
//			}
//		}
//
//	}
}
